﻿using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.Contracts;

namespace MathService.Trees
{
    [ContractClass(typeof(ContractClassForITree<>))]
    public interface ITree<TValue> : IIndexable<ITree<TValue>>, IEnumerable<ITree<TValue>>
    {
        int Depth { get; }

        TValue Value { get; set; }
    }

    [ContractClassFor(typeContractsAreFor: typeof(ITree<>))]
    class ContractClassForITree<TValue> : ITree<TValue>
    {
        public int Count { get { Contract.Ensures(Contract.Result<int>() >= 0); return 0; } }

        public int Depth { get { Contract.Ensures(Contract.Result<int>() >= 0); return 0; } }

        public TValue Value { get { return default(TValue); } set { } }

        /// <summary>Индексатор объекта</summary><param name="index">Индекс</param>
        public ITree<TValue> this[int index]
        {
            get
            {
                Contract.Requires(index >= 0);
                Contract.Requires(index < Count);
                return null;
            }
            set
            {
                Contract.Requires(index >= 0);
                Contract.Requires(index < Count);
            }
        }

        /// <summary>Возвращает перечислитель, выполняющий перебор элементов в коллекции.</summary>
        /// <returns>
        /// Интерфейс <see cref="T:System.Collections.Generic.IEnumerator`1"/>, который может использоваться для перебора элементов коллекции.
        /// </returns>
        /// <filterpriority>1</filterpriority>
        public IEnumerator<ITree<TValue>> GetEnumerator() { return null; }

        /// <summary>Возвращает перечислитель, который осуществляет перебор элементов коллекции.</summary>
        /// <returns>
        /// Объект <see cref="T:System.Collections.IEnumerator"/>, который может использоваться для перебора элементов коллекции.
        /// </returns>
        /// <filterpriority>2</filterpriority>
        IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
    }
}
